package com.xiyue.leaspring.dao;

import java.util.List;
import java.util.Set;

import javax.transaction.Transactional;

import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.RepositoryDefinition;
import org.springframework.data.repository.query.Param;

import com.xiyue.leaspring.po.Dept;

@RepositoryDefinition(domainClass = Dept.class,idClass = Long.class)
public interface IDeptDAO{

	/**
	 * 增加新的部门数据，方法名称定义为save,以自动实现merge()功能
	 * @param vo 部门持久化对象
	 * @return 增加成功，返回持久化对象
	 */
	public Dept save(Dept vo);
	
	
	/**
	 * 查询全部部门数据
	 * @return 部门持久化对象集合
	 */
	@Query("SELECT d FROM Dept AS d")
	public List<Dept> findAll();
	
	/**
	 * 根据ID进行查询，在JPQL获取参数时使用SpEL表达式获取第一个参数
	 * @param id 查询的部分编号
	 * @return 部门持久化对象
	 */
	@Query("SELECT d FROM Dept AS d WHERE d.deptno=?#{[0]}")//使用SpEL语法获得参数
	public Dept findById(Long id);
	
	
	/**
	 * 根据指定范围ID进行查询
	 * @param ids 全部部门ID
	 * @return 部门持久化对象
	 */
	@Query("SELECT d FROM Dept AS d WHERE d.deptno IN :pids")//使用pids获得参数
	public List<Dept> findByIds(@Param(value="pids")Set<Long> ids);
	
	
	/**
	 * 根据指定ID与部门名称进行查询
	 * @param dept 包含部门ID与部门名称dname
	 * @return Dept 部门持久化对象
	 */
	@Query("SELECT d FROM Dept AS d WHERE d.deptno=:#{#mydept.deptno} AND d.dname=:#{#mydept.dname}")//使用pids获得参数
	public Dept findByIdAndName(@Param(value="mydept")Dept dept);

	/**
	 * 修改指定编号的部门信息
	 * @param dept 传递需要修改的部门数据
	 * @return 数据库更新影响的数据行数
	 */
	@Transactional
	@Modifying(clearAutomatically = true) //追加缓存的清楚与更新
	@Query("UPDATE Dept AS d SET d.dname=:#{#mydept.dname} WHERE d.deptno=:#{#mydept.deptno}")//
	public int doEdit(@Param(value="mydept")Dept dept);
	
	/**
	 * 修改指定删除的部门信息
	 * @param deptno 部门编号
	 * @return 数据库更新影响的数据行数
	 */
	@Transactional
	@Modifying(clearAutomatically = true) //追加缓存的清楚与更新
	@Query("DELETE FROM Dept AS d WHERE d.deptno=:deptno")//
	public int doRemove(@Param(value="deptno")Long dept);
	
	/**
	 * 根据名称查询
	 * @param dname 部门名称
	 * @return
	 */
	public List<Dept> findByDname(String dname);
	
	/**
	 * 根据部门指定ids查询
	 * @param ids 查询部门的ids
	 * @return 返回结果
	 */
	public List<Dept> findByDeptnoIn(Set<Long> ids);
	
	/**
	 * 根据部门名称进行模糊查询（containing表示前后都追加%），而后将查询结果按照deptno降序排列
	 * @param keyWord 查询关键字
	 * @return 部门持久化对象集合
	 */
	public List<Dept> findByDnameContainingOrderByDeptnoDesc(String keyWord);
	
	
}
